package com.charging.business.vo;

import com.alibaba.fastjson2.annotation.JSONField;
import com.charging.business.media.*;
import lombok.Data;

import java.util.List;

/**
 * @author JerryLu
 * @date 2024/9/26 11:35
 * @description 出口计费请求参数类
 */
@Data
public class FeeExCalcRequest {
    /**
     * 通知消息号
     */
    @JSONField(ordinal = 0)
    public String msgId = "";

    /**
     * 通行介质类型,1位数字
     * 1-OBU
     * 2-CPC卡
     * 3-纸券
     * 9-无通行介质
     */
    @JSONField(ordinal = 1)
    public Integer mediaType;

    /**
     * 当前收费门架编码
     */
    public String curTollGantry;

    /**
     * 介质编码
     * OBU序号编码16位
     * CPC卡16位
     * 无介质通行为030
     * 纸券，01+纸券标识(不超过20位)
     * ETC卡号20位
     */
    @JSONField(ordinal = 2)
    public String mediaNo;

    /**
     * 发行服务机构Id
     * 参考《编码规则》附录表七：发行服务机构编号列表，校验真实性。
     */
    @JSONField(ordinal = 3)
    public String issuerId;

    /**
     * 是否折扣,通行介质为OBU时，根据业务规则是否折扣
     * 1-折扣
     * 2-不折扣
     */
    public Integer isDiscount;

    /**
     * 是否验证最小费额，默认为1
     * 1-验证
     * 2-不验证
     */
    public Integer validShortFee;

    /**
     * 入口收费站编号
     */
    public String enStationId;

    /**
     * 入口收费站Hex
     * 若为U转出口计费且uTurn类型type为3，此处为掉头点入口收费站Hex
     */
    public String enStationHex;

    /**
     * 入口车道编号
     */
    public String enTollLaneId;

    /**
     * 入口时间
     * yyyy-MM-ddTHH:mm:ss
     */
    public String enTime;

    /**
     * 出口收费站编号
     */
    public String exStationId;

    /**
     * 出口收费站Hex
     */
    public String exStationHex;

    /**
     * 出口车道编号
     */
    public String exTollLaneId;

    /**
     * 出口时间
     * yyyy-MM-ddTHH:mm:ss
     */
    public String exTime;

    /**
     * 车辆车牌号码+颜色
     * 车牌号码+间隔符+车牌颜色,间隔符：“_”,车牌颜色2位数字
     * 0-蓝色
     * 1-黄色
     * 2-黑色
     * 3-白色
     * 4-渐变绿色
     * 5-黄绿双拼色
     * 6-蓝白渐变色
     * 7-临时牌照
     * 11-绿色
     * 12-红色
     * 例：京A12345_1
     */
    public String vehicleId;

    /**
     * 入口车型
     */
    public Integer enVehicleType;

    /**
     * 出口车型
     */
    public Integer exVehicleType;

    /**
     * 车种
     * 必填：CPC必填
     */
    public Integer vehicleClass;

    /**
     * 车辆用户类型
     * CPU卡0015文件或双片式标签EF04文件或单片式标签EF01文件
     * 必填：ETC必填
     * 0-普通车
     * 6-公务车
     * 8-军警车
     * 10-紧急车
     * 12-免费
     * 14-车队
     * 24-Jl类型集装箱
     * 25-大件运输车
     * 26-应急车
     * 27-货车列车或半挂汽车列车
     * 28-J2类型集装箱
     */
    public Integer vehicleUserType;

    /**
     * 车辆状态标识
     * 0x00 -本次通行用
     * 于大件运输；0x01 -非优惠车辆；0x02 -绿
     * 通车辆；0x03 -联合收割机车辆； 0x04 - 集装箱车辆。
     * 0x05-0x50 预留为通行管理平台使用，其
     * 中 :0x05- 疫 苗 车 ； 0x06- 抢 险 救 灾 车 ；
     * 0x51-0xfe 预留；默认写入 0xff
     */
    public String vehicleSign;

    /**
     * 入口车辆轴数
     */
    public Integer enAxleCount;

    /**
     * 出口车辆轴数
     */
    public Integer exAxleCount;

    /**
     * ETC卡片类型
     * 22-储值卡
     * 23-记账卡
     * 非双片式或双片式标签无卡时填0
     */
    public Integer CPUCardType;

    /**
     * 卡片版本号
     */
    public Integer CPUVersion;

    /**
     * 卡交易前余额
     */
    public Long preBalance;

    /**
     * 通行标识ID
     * 通行介质ID(OBU序号编码/CPC卡编码)+入口时间（YYYYMMDDHHmmss）
     */
    public String passId;

    /**
     * 特情类型
     * 若多个以“|”分割
     */
    public String specialType;

    /**
     * 特情参数
     * 若多个以“|”分割 特情参数，与特情类型一一对应。默认：空
     */
    public String specialValue;

    /**
     * 交易支付方式
     * 1-出口ETC通行
     * 2-出口ETC刷卡通行
     * 3-其他交易
     */
    public Integer transPayType;

    /**
     * 支付方式
     * 0-未知
     * 1-现金
     * 2-其他第三方账户支付
     * 3-银联卡
     * 4-ETC卡支付
     * 6-支付宝
     * 7-微信
     * 8-数字人民币
     */
    public Integer payType;

    /**
     * ETC卡DF01下0002内容
     * 钱包文件
     * 样例:"FA087953","00000000"
     * 必填：通行介质为OBU时填写
     */
    public String ETCCARD0002;

    /**
     * ETC卡DF01下0015内容
     * 必填：通行介质为OBU时填写
     */
    public String ETCCARD0015;

    /**
     * ETC卡DF01下0019内容
     * 必填：通行介质为OBU时填写
     */
    public String ETCCARD0019;

    /**
     * OBU内EF04文件内容
     * 必填：通行介质为OBU时填写
     */
    public String OBUEF04;

    /**
     * OBU内EF01文件内容
     * DF下EF01(车辆信息文件)
     * 必填：通行介质为OBU时填写
     */
    public String OBUEF01;

    /**
     * CPC卡MF下EF01内容
     * CPC卡系统信息文件
     * 必填：通行介质为CPC时填写
     */
    public String CPCMFEF01;

    /**
     * CPC卡MF下EF012内容
     * CPC卡基本信息文件
     * 必填：通行介质为CPC时填写
     */
    public String CPCMFEF02;

    /**
     * CPC卡DF01下EF01内容
     * CPC卡入口信息文件
     * 必填：通行介质为CPC时填写
     */
    public String CPCEF01;

    /**
     * CPC卡DF01下EF02内容
     * CPC卡过站信息文件
     * 必填：通行介质为CPC时填写
     */
    public String CPCEF02;

    /**
     * CPC卡DF01下EF04内容
     * 必填：通行介质为CPC时填写
     */
    public String CPCEF04;

    /**
     * 是否人工修改门架列表
     * 0-未修改
     * 1-已修改
     */
    public Integer pathInfoEdited;

    /**
     * 通行门架列表
     * 必填：pathInfoEdited为1时必填
     */
    public List<PathInfo> pathInfo;

    /**
     * 预留字段1
     */
    public Integer spare1;

    /**
     * 预留字段2
     */
    public Integer spare2;

    /**
     * 预留字段3
     */
    public Integer spare3;

    /**
     * 预留字段4
     */
    public String spare4;

    /**
     * 预留字段5
     */
    public String spare5;

    /**
     * U转出口计费参数
     * 必填：U转计费时必填
     */
    public UTurn uTurn;

    /**
     * 出口计费请求参数之路径信息
     *
     */
    public static class PathInfo {
        /**
         * 收费门架 Hex,不超过 50 个字符
         */
        public String gantryHex;

        /**
         * 通行时间
         * yyyy-MM-ddTHH:mm:ss
         * 必填：否
         */
        public String passTime;

        /**
         * 类型
         * 必填：否
         * 1-通行
         * 2-牌识
         * 3-gps
         * 4-拟合增加
         * 5-拟合删除
         * 6-人工增加
         * 7-人工删除
         */
        public Integer gantryType;
    }

    /**
     * 出口计费U转信息
     */
    public static class UTurn {
        /**
         * U转类型
         * 必填：是
         * 1：按时间计费
         * 2：按里程计费
         * 3：按掉头站点2倍计费
         */

        public Integer type;

        /**
         * U转参数,根据type的值而定
         * 必填：是
         * type为2 - 此值填写里程，单位米
         * type为3 - 此值填写掉头点站的ID
         * type其它值留空
         */
        public String param;
    }

    /**
     * 双片OBU车辆信息文件
     */
    @JSONField(serialize = false, deserialize = false)
    public ObuEf01Model obuEf01Model = null;

    /**
     * 双片OBU交费信息文件
     */
    @JSONField(serialize = false, deserialize = false)
    public ObuEf04Model obuEf04Model = null;

    /**
     * 用户卡发行基本数据文件
     */
    @JSONField(serialize = false, deserialize = false)
    public Card0015Model card0015Model = null;

    /**
     * 用户卡复合消费专用文件
     */
    @JSONField(serialize = false, deserialize = false)
    public Card0019Model card0019Model = null;

    /**
     * CPC卡系统信息文件(MF/EF01)内容
     */
    @JSONField(serialize = false, deserialize = false)
    public CpcMfEf01Model cpcMfEf01Model = null;

    /**
     * CPC卡入口信息文件
     */
    @JSONField(serialize = false, deserialize = false)
    public CpcEf01Model cpcEf01Model = null;

    /**
     * CPC卡基本信息文件
     */
    @JSONField(serialize = false, deserialize = false)
    public CpcMfEf02Model cpcMfEf02Model = null;

    /**
     * CPC卡过站信息文件
     */
    @JSONField(serialize = false, deserialize = false)
    public CpcEf02Model cpcEf02Model = null;

    /**
     * CPC卡计费信息文件
     */
    @JSONField(serialize = false, deserialize = false)
    public CpcEf04Model cpcEf04Model = null;

    /**
     * 解析各类标签文件
     */
    @JSONField(serialize = false, deserialize = false)
    public void parseTagFiles() {
        Card0015EdModel card0015EdModel = Card0015EdModel.parse(ETCCARD0015);
        if (card0015EdModel != null) {
            card0015Model = card0015EdModel.decoded(0, 0);
        }

        Card0019EdModel card0019EdModel = Card0019EdModel.parse(ETCCARD0019);
        if (card0019EdModel != null) {
            card0019Model = card0019EdModel.decoded();
        }

        ObuEf01EdModel obuEf01EdModel = ObuEf01EdModel.parse(OBUEF01);
        if (obuEf01EdModel != null) {
            obuEf01Model = obuEf01EdModel.decoded();
        }

        ObuEf04EdModel obuEf04EdModel = ObuEf04EdModel.parse(OBUEF04);
        if (obuEf04EdModel != null) {
            obuEf04Model = obuEf04EdModel.decoded();
        }

        CpcMfEf01EdModel cpMEF01ED = CpcMfEf01EdModel.parse(CPCMFEF01);
        if (cpMEF01ED != null) {
            cpcMfEf01Model = cpMEF01ED.decoded();
        }

        CpcMfEf02EdModel cpcMfEf02EdModel = CpcMfEf02EdModel.parse(CPCMFEF02);
        if (cpcMfEf02EdModel != null) {
            cpcMfEf02Model = cpcMfEf02EdModel.decoded();
        }

        CpcEf01EdModel cpcEf01EdModel = CpcEf01EdModel.parse(CPCEF01);
        if (cpcEf01EdModel != null) {
            cpcEf01Model = cpcEf01EdModel.decoded();
        }

        CpcEf02EdModel cpcEf02EdModel = CpcEf02EdModel.parse(CPCEF02);
        if (cpcEf02EdModel != null) {
            cpcEf02Model = cpcEf02EdModel.decoded();
        }

        CpcEf04EdModel cpcEf04EdModel = CpcEf04EdModel.parseST(CPCEF04);
        if (cpcEf04EdModel != null) {
            cpcEf04Model = cpcEf04EdModel.decoded();
        }
    }
}
